package org.origin.centre.utils;

import org.origin.centre.config.properties.ServerProperty;
import org.origin.centre.support.utils.BasicUtil;
import org.springframework.cache.Cache;
import org.springframework.cache.CacheManager;

/**
 * 系统缓存工具
 *
 * @author ferret
 * @version 2024-05-08
 */
@SuppressWarnings("unused")
public final class CacheUtil {
    public volatile static String cacheName;
    private volatile static CacheManager cacheManager;

    /**
     * 保存
     *
     * @param key   键
     * @param value 值
     */
    public static Object put(String key, Object value) {
        return put(getCacheName(), key, value);
    }

    /**
     * 保存
     *
     * @param key   键
     * @param value 值
     */
    public static Object put(String name, String key, Object value) {
        Cache cache = getCacheManager().getCache(name);
        if (cache != null) cache.put(key, value);
        return value;
    }

    /**
     * 获取
     *
     * @param key   键
     * @param clazz 值类型
     */
    public static <T> T get(String key, Class<T> clazz) {
        return get(getCacheName(), key, clazz);
    }

    /**
     * 获取
     *
     * @param key   键
     * @param clazz 值类型
     */
    public static <T> T get(String name, String key, Class<T> clazz) {
        Cache cache = getCacheManager().getCache(name);
        return cache != null ? cache.get(key, clazz) : null;
    }

    /**
     * 删除
     *
     * @param key 键
     */
    public static void remove(String key) {
        remove(getCacheName(), key);
    }

    /**
     * 删除
     *
     * @param key 键
     */
    public static void remove(String name, String key) {
        Cache cache = getCacheManager().getCache(name);
        if (cache != null) cache.evict(key);
    }

    /**
     * 删除所有
     */
    public static void clear() {
        clear(getCacheName());
    }

    /**
     * 删除所有
     */
    public static void clear(String name) {
        Cache cache = getCacheManager().getCache(name);
        if (cache != null) cache.clear();
    }

    /**
     * 获取一个缓存管理器的实例。如果缓存管理器实例尚未创建，则通过SpringUtil的getBean方法获取一个CacheManager实例，并通过双检锁的方式确保线程安全。最后返回缓存管理器实例。
     */
    public static String getCacheName() {
        if (cacheName == null) {
            synchronized (CacheUtil.class) {
                if (cacheName == null) {
                    ServerProperty serverProperty = SpringUtil.getBean(ServerProperty.class);
                    cacheName = BasicUtil.getBlankVal(serverProperty.getCacheKeyPrefix(), "origin");
                }
            }
        }
        return cacheName;
    }

    /**
     * 获取一个缓存管理器的实例。如果缓存管理器实例尚未创建，则通过SpringUtil的getBean方法获取一个CacheManager实例，并通过双检锁的方式确保线程安全。最后返回缓存管理器实例。
     */
    public static CacheManager getCacheManager() {
        if (cacheManager == null) {
            synchronized (CacheUtil.class) {
                if (cacheManager == null) {
                    cacheManager = SpringUtil.getBean(CacheManager.class);
                }
            }
        }
        return cacheManager;
    }
}
